package com.skyd.core.game.td;

import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;

import com.skyd.core.common.Point;
import com.skyd.core.game.GamePathfinder;
import com.skyd.core.game.IGameMapPiece;
import com.skyd.core.vector.Vector2DF;

public class TDMap implements ITDMap {

	/**
	 * 初始值为null。 功能注释：寻路者
	 */
	private GamePathfinder _Pathfinder = null;

	/**
	 * 获取Pathfinder。 功能注释：寻路者，在执行setPieces()时初始化
	 * 
	 * @return 当前的GamePathfinder类型的值
	 */
	public GamePathfinder getPathfinder() {
		return _Pathfinder;
	}

	/**
	 * 设置Pathfinder。 功能注释：寻路者
	 * 
	 * @param value
	 *            要设置的GamePathfinder类型值
	 */
	protected void setPathfinder(GamePathfinder value) {
		_Pathfinder = value;
	}

	/**
	 * 设置Pathfinder为其默认值(null)。 功能注释：寻路者
	 */
	protected void setPathfinderToDefault() {
		setPathfinder(null);
	}

	@Override
	public void update() {
		for (int i = 0; i < _Pieces.length; i++) {
			for (int j = 0; j < _Pieces[i].length; j++) {
				_Pieces[i][j].update();
			}
		}
	}

	@Override
	public Vector2DF getSize() {
		float w = 0, h = 0;
		if (_Pieces != null && _Pieces.length > 0 && _Pieces[0].length > 0) {
			Vector2DF sz = getPieceStandardSize();
			w = _Pieces.length * sz.getX();
			h = _Pieces[0].length * sz.getY();
		}
		return new Vector2DF(w, h);
	}

	/**
	 * 初始值为null。 功能注释：地图块标准尺寸
	 */
	private Vector2DF _PieceStandardSize = null;

	/**
	 * 获取PieceStandardSize。 功能注释：地图块标准尺寸
	 * 
	 * @return 当前的Vector2DF类型的值
	 */
	public Vector2DF getPieceStandardSize() {
		return _PieceStandardSize.getClone();
	}

	/**
	 * 设置PieceStandardSize。 功能注释：地图块标准尺寸
	 * 
	 * @param value
	 *            要设置的Vector2DF类型值
	 */
	public void setPieceStandardSize(Vector2DF value) {
		_PieceStandardSize = value;
	}

	/**
	 * 设置PieceStandardSize为其默认值(null)。 功能注释：地图块标准尺寸
	 */
	public void setPieceStandardSizeToDefault() {
		setPieceStandardSize(null);
	}

	/**
	 * 初始值为null。 功能注释：地图块数据
	 */
	private ITDMapPiece[][] _Pieces = null;

	/**
	 * 获取Pieces。 功能注释：地图块数据
	 * 
	 * @return 当前的ITDMapPiece[][]类型的值
	 */
	public ITDMapPiece[][] getPieces() {
		return _Pieces;
	}

	/**
	 * 设置Pieces。 功能注释：地图块数据
	 * 
	 * @param value
	 *            要设置的ITDMapPiece[][]类型值
	 */
	public void setPieces(ITDMapPiece[][] value) {
		_Pieces = value;
		setPathfinder(new GamePathfinder(value));
	}

	/**
	 * 设置Pieces为其默认值(null)。 功能注释：地图块数据
	 */
	public void setPiecesToDefault() {
		setPieces(null);
	}
	
	
	/**
	 * 规划路线
	 * @param start 起点
	 * @param end 终点
	 * @param containStartPosion 包含起点坐标
	 * @param ignoreHinder 忽略障碍
	 * @return 行进路线
	 */
	public static CopyOnWriteArrayList<Vector2DF> planningRoute(ITDMapPiece start,ITDMapPiece end,boolean containStartPosion,boolean ignoreHinder){
		GamePathfinder pathfinder = TDWorld.getInstance().getMap().getPathfinder();
		pathfinder.setStartingPoint(start.getIndexLocation());
		pathfinder.setFinishingPoint(end.getIndexLocation());
		CopyOnWriteArrayList<IGameMapPiece> ra = pathfinder.CalculatingRoute(ignoreHinder);
		CopyOnWriteArrayList<Vector2DF> rpa=new CopyOnWriteArrayList<Vector2DF>();
		if(containStartPosion)rpa.add(start.getCenterPosion());
		for (IGameMapPiece f : ra) {
			rpa.add(((ITDMapPiece)f).getCenterPosion());
		}
		return rpa;
	}

	@Override
	public void putEntityTo(ITDEntity e, int xIndex, int yIndex) {
		e.setPosition(getPieces()[xIndex][yIndex].getCenterPosion());
	}

	@Override
	public ITDMapPiece getPiece(Point p) {
		return getPieces()[p.x][p.y];
	}

	@Override
	public ArrayList<ITDMapExitPiece> getExitPieces() {
		ArrayList<ITDMapExitPiece> a=new ArrayList<ITDMapExitPiece>();
		for (int i = 0; i < getPieces().length; i++) {
			for (int j = 0; j < getPieces()[i].length; j++) {
				if(getPieces()[i][j] instanceof ITDMapExitPiece)a.add((ITDMapExitPiece)getPieces()[i][j]);
			}
		}
		return a;
	}

	@Override
	public ITDMapPiece getPieceByPosition(float x, float y) {
		Vector2DF s = getPieceStandardSize();
		for (int i = 0; i < getPieces().length; i++) {
			for (int j = 0; j < getPieces()[i].length; j++) {
				float left = s.getX()*i;
				float top=s.getY()*j;
				if(x>=left&&x<=left+s.getX()&&y>=top&&y<=top+s.getY())return getPieces()[i][j];
			}
		}
		return null;
	}

}
